package dao.lantern;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import lcaInterfaceDAO.IUnidadEjercitoDAO;
import dao.api.BaseDAO;
import dao.api.DataObject;

public class UnidadEjercitoDAO extends BaseDAO implements IUnidadEjercitoDAO {

	public UnidadEjercitoDAO() {

	}

	public int countAll() throws SQLException {
		StringBuffer strbuf = new StringBuffer();

		strbuf.append("SELECT COUNT(*) FROM ");
		strbuf.append(getTableName());

		System.err.println(strbuf.toString());

		ResultSet rs = //
		connection.createStatement().executeQuery(strbuf.toString());

		rs.next();

		return rs.getInt("count");
	}

	public void createTable() throws SQLException {
		StringBuffer strbuf;

		// ----------------------------------------

		strbuf = new StringBuffer();

		strbuf.append("DROP TABLE IF EXISTS ");
		strbuf.append(getTableName());
		strbuf.append(" CASCADE");

		System.err.println(strbuf.toString());

		connection.createStatement().execute(strbuf.toString());

		// ----------------------------------------

		strbuf = new StringBuffer();

		strbuf.append("DROP SEQUENCE IF EXISTS ");
		strbuf.append("seq_");
		strbuf.append(getTableName());

		System.err.println(strbuf.toString());

		connection.createStatement().execute(strbuf.toString());

		// ----------------------------------------

		UnidadBasicaDAO unidadBasicaDAO = new UnidadBasicaDAO();
		unidadBasicaDAO.init(connectionBean);

		strbuf = new StringBuffer();

		strbuf.append("CREATE TABLE ");
		strbuf.append(getTableName());
		strbuf.append(" (");
		strbuf.append(UnidadEjercitoDO.ID);
		strbuf.append(" INT PRIMARY KEY, ");
		strbuf.append(UnidadEjercitoDO.NOMBRE);
		strbuf.append(" VARCHAR(50) UNIQUE,    ");
		strbuf.append(UnidadEjercitoDO.UNIDAD_BASICA_ARMA_ID);
		strbuf.append(" INT REFERENCES   ");
		strbuf.append(unidadBasicaDAO.getTableName());
		strbuf.append(", ");
		strbuf.append(UnidadEjercitoDO.UNIDAD_BASICA_BALA_ID);
		strbuf.append(" INT REFERENCES   ");
		strbuf.append(unidadBasicaDAO.getTableName());
		strbuf.append(", ");
		strbuf.append(UnidadEjercitoDO.UNIDAD_BASICA_ROBOT_ID);
		strbuf.append(" INT REFERENCES   ");
		strbuf.append(unidadBasicaDAO.getTableName());
		strbuf.append(", ");
		strbuf.append(UnidadEjercitoDO.UNIDAD_BASICA_VEHICULO_ID);
		strbuf.append(" INT REFERENCES   ");
		strbuf.append(unidadBasicaDAO.getTableName());

		strbuf.append(")");

		System.err.println(strbuf.toString());

		connection.createStatement().execute(strbuf.toString());

		// ----------------------------------------

		strbuf = new StringBuffer();

		strbuf.append("CREATE SEQUENCE ");
		strbuf.append("seq_");
		strbuf.append(getTableName());

		System.err.println(strbuf.toString());

		connection.createStatement().execute(strbuf.toString());

	}

	public void delete(DataObject dataObject) throws SQLException {
		checkCache(dataObject, CHECK_DELETE);
		checkClass(dataObject, UnidadEjercitoDO.class, CHECK_DELETE);

		UnidadEjercitoDO unidadEjercitoDO = (UnidadEjercitoDO) dataObject;

		StringBuffer strbuf = new StringBuffer();

		strbuf.append("DELETE FROM ");
		strbuf.append(getTableName());

		strbuf.append(" WHERE ");
		strbuf.append(UnidadEjercitoDO.ID);
		strbuf.append(" = ");
		strbuf.append(unidadEjercitoDO.getId());

		System.err.println(strbuf.toString());

		connection.createStatement().execute(strbuf.toString());

		dtaSession.del(dataObject);

	}

	public void insert(DataObject dataObject) throws SQLException {
		checkCache(dataObject, CHECK_INSERT);
		checkClass(dataObject, UnidadEjercitoDO.class, CHECK_INSERT);

		UnidadEjercitoDO unidadEjercitoDO = (UnidadEjercitoDO) dataObject;

		unidadEjercitoDO.setId(getNextId());

		StringBuffer strbuf = new StringBuffer();

		strbuf.append("INSERT INTO ");
		strbuf.append(getTableName());
		strbuf.append(" VALUES (");
		strbuf.append(unidadEjercitoDO.getId());
		strbuf.append(", ");
		strbuf.append(singleQuotes(unidadEjercitoDO.getNombre()));
		strbuf.append(", ");

		if (unidadEjercitoDO.getUnidadBasicaArmaRef() == null) {
			strbuf.append("NULL");
		} else {
			// Can't save this (no cascade support yet or defined so far)
			if (unidadEjercitoDO.getUnidadBasicaArmaRef().getId() == 0) {
				throw new IllegalArgumentException( //
						"unidadEjercitoDO.getUnidadBasicaArmaRef().getId() == 0");
			} else {
				unidadEjercitoDO.setUnidadBasicaArmaId( //
						unidadEjercitoDO.getUnidadBasicaArmaRef().getId());
				strbuf.append(unidadEjercitoDO.getUnidadBasicaArmaId());
			}
		}
		strbuf.append(", ");

		if (unidadEjercitoDO.getUnidadBasicaBalaRef() == null) {
			strbuf.append("NULL");
		} else {
			// Can't save this (no cascade support yet or defined so far)
			if (unidadEjercitoDO.getUnidadBasicaBalaRef().getId() == 0) {
				throw new IllegalArgumentException( //
						"unidadEjercitoDO.getUnidadBasicaBalaRef().getId() == 0");
			} else {
				unidadEjercitoDO.setUnidadBasicaBalaId( //
						unidadEjercitoDO.getUnidadBasicaBalaRef().getId());
				strbuf.append(unidadEjercitoDO.getUnidadBasicaBalaId());
			}
		}
		strbuf.append(", ");

		if (unidadEjercitoDO.getUnidadBasicaRobotRef() == null) {
			strbuf.append("NULL");
		} else {
			// Can't save this (no cascade support yet or defined so far)
			if (unidadEjercitoDO.getUnidadBasicaRobotRef().getId() == 0) {
				throw new IllegalArgumentException( //
						"unidadEjercitoDO.getUnidadBasicaRobotRef().getId() == 0");
			} else {
				unidadEjercitoDO.setUnidadBasicaRobotId( //
						unidadEjercitoDO.getUnidadBasicaRobotRef().getId());
				strbuf.append(unidadEjercitoDO.getUnidadBasicaRobotId());
			}
		}
		strbuf.append(", ");

		if (unidadEjercitoDO.getUnidadBasicaVehiculoRef() == null) {
			strbuf.append("NULL");
		} else {
			// Can't save this (no cascade support yet or defined so far)
			if (unidadEjercitoDO.getUnidadBasicaVehiculoRef().getId() == 0) {
				throw new IllegalArgumentException( //
						"unidadEjercitoDO.getUnidadBasicaVehiculoRef().getId() == 0");
			} else {
				unidadEjercitoDO.setUnidadBasicaVehiculoId( //
						unidadEjercitoDO.getUnidadBasicaVehiculoRef().getId());
				strbuf.append(unidadEjercitoDO.getUnidadBasicaVehiculoId());
			}
		}

		strbuf.append(")");

		System.err.println(strbuf.toString());

		connection.createStatement().execute(strbuf.toString());

		dtaSession.add(dataObject);

	}

	private int getNextId() throws SQLException {
		StringBuffer strbuf = new StringBuffer();

		strbuf.append("SELECT nextval(");
		strbuf.append(singleQuotes("seq_" + getTableName()));
		strbuf.append(")");

		System.err.println(strbuf.toString());

		ResultSet rs = //
		connection.createStatement().executeQuery(strbuf.toString());

		if (!rs.next()) {
			throw new IllegalStateException("!rs.next()");
		}

		return rs.getInt("nextval");
	}

	@Override
	public List<DataObject> listAll(int lim, int off) throws SQLException {
		StringBuffer strbuf = new StringBuffer();

		strbuf.append("SELECT * FROM ");
		strbuf.append(getTableName());

		if (lim >= 0 && off >= 0) {
			strbuf.append(" LIMIT  ");
			strbuf.append(lim);
			strbuf.append(" OFFSET ");
			strbuf.append(off);
		}

		System.err.println(strbuf.toString());

		ResultSet rs = //
		connection.createStatement().executeQuery(strbuf.toString());

		List<DataObject> ret = new ArrayList<DataObject>();

		while (rs.next()) {
			ret.add(resultSetToDO(rs));
		}

		return ret;
	}

	private DataObject resultSetToDO(ResultSet rs) throws SQLException {
		UnidadEjercitoDO ret = //
		(UnidadEjercitoDO) dtaSession.getDtaByKey( //
				UnidadEjercitoDO.class, rs.getInt(UnidadEjercitoDO.ID));

		if (ret != null) {
			return ret;
		}

		ret = new UnidadEjercitoDO();

		ret.setId/*      */(rs.getInt(UnidadEjercitoDO.ID));
		ret.setNombre/*  */(rs.getString(UnidadEjercitoDO.NOMBRE));

		ret.setUnidadBasicaArmaId(rs
				.getInt(UnidadEjercitoDO.UNIDAD_BASICA_ARMA_ID));
		ret.setUnidadBasicaBalaId(rs
				.getInt(UnidadEjercitoDO.UNIDAD_BASICA_BALA_ID));
		ret.setUnidadBasicaRobotId(rs
				.getInt(UnidadEjercitoDO.UNIDAD_BASICA_ROBOT_ID));
		ret.setUnidadBasicaVehiculoId(rs
				.getInt(UnidadEjercitoDO.UNIDAD_BASICA_VEHICULO_ID));

		return (UnidadEjercitoDO) dtaSession.add(ret);
	}

	public List<DataObject> listAll() throws SQLException {
		return listAll(-1, -1);
	}

	public DataObject loadById(int id) throws SQLException {
		StringBuffer strbuf = new StringBuffer();

		strbuf.append("SELECT * FROM ");
		strbuf.append(getTableName());

		strbuf.append(" WHERE ");
		strbuf.append(UnidadEjercitoDO.ID);
		strbuf.append(" = ");
		strbuf.append(id);

		System.err.println(strbuf.toString());

		ResultSet rs = //
		connection.createStatement().executeQuery(strbuf.toString());

		if (rs.next()) {
			return resultSetToDO(rs);
		}

		return null;
	}

	public void update(DataObject dataObject) throws SQLException {
		checkCache(dataObject, CHECK_UPDATE);
		checkClass(dataObject, UnidadEjercitoDO.class, CHECK_UPDATE);

		UnidadEjercitoDO unidadEjercitoDO = (UnidadEjercitoDO) dataObject;

		StringBuffer strbuf = new StringBuffer();

		strbuf.append("UPDATE ");
		strbuf.append(getTableName());
		strbuf.append(" SET ");

		strbuf.append(UnidadEjercitoDO.NOMBRE);
		strbuf.append(" = ");
		strbuf.append(singleQuotes(unidadEjercitoDO.getNombre()));
		strbuf.append(", ");

		strbuf.append(UnidadEjercitoDO.UNIDAD_BASICA_ARMA_ID);
		strbuf.append(" = ");

		if (unidadEjercitoDO.getUnidadBasicaArmaRef() == null) {
			if (unidadEjercitoDO.getUnidadBasicaArmaId() == 0) {
				strbuf.append("NULL");
			} else {
				strbuf.append(unidadEjercitoDO.getUnidadBasicaArmaRef());
			}
		} else {
			if (unidadEjercitoDO.getUnidadBasicaArmaRef().getId() == 0) {
				throw new IllegalArgumentException( //
						"unidadEjercitoDO.getUnidadBasicaArmaRef().getId() == 0");
			} else {
				unidadEjercitoDO.setUnidadBasicaArmaId( //
						unidadEjercitoDO.getUnidadBasicaArmaRef().getId());
				strbuf.append(unidadEjercitoDO.getUnidadBasicaArmaId());
			}
		}
		strbuf.append(", ");

		strbuf.append(UnidadEjercitoDO.UNIDAD_BASICA_BALA_ID);
		strbuf.append(" = ");

		if (unidadEjercitoDO.getUnidadBasicaBalaRef() == null) {
			if (unidadEjercitoDO.getUnidadBasicaBalaId() == 0) {
				strbuf.append("NULL");
			} else {
				strbuf.append(unidadEjercitoDO.getUnidadBasicaBalaRef());
			}
		} else {
			if (unidadEjercitoDO.getUnidadBasicaBalaRef().getId() == 0) {
				throw new IllegalArgumentException( //
						"unidadEjercitoDO.getUnidadBasicaBalaRef().getId() == 0");
			} else {
				unidadEjercitoDO.setUnidadBasicaBalaId( //
						unidadEjercitoDO.getUnidadBasicaBalaRef().getId());
				strbuf.append(unidadEjercitoDO.getUnidadBasicaBalaId());
			}
		}
		strbuf.append(", ");

		strbuf.append(UnidadEjercitoDO.UNIDAD_BASICA_ROBOT_ID);
		strbuf.append(" = ");

		if (unidadEjercitoDO.getUnidadBasicaRobotRef() == null) {
			if (unidadEjercitoDO.getUnidadBasicaRobotId() == 0) {
				strbuf.append("NULL");
			} else {
				strbuf.append(unidadEjercitoDO.getUnidadBasicaRobotRef());
			}
		} else {
			if (unidadEjercitoDO.getUnidadBasicaRobotRef().getId() == 0) {
				throw new IllegalArgumentException( //
						"unidadEjercitoDO.getUnidadBasicaRobotRef().getId() == 0");
			} else {
				unidadEjercitoDO.setUnidadBasicaRobotId( //
						unidadEjercitoDO.getUnidadBasicaRobotRef().getId());
				strbuf.append(unidadEjercitoDO.getUnidadBasicaRobotId());
			}
		}
		strbuf.append(", ");

		strbuf.append(UnidadEjercitoDO.UNIDAD_BASICA_VEHICULO_ID);
		strbuf.append(" = ");

		if (unidadEjercitoDO.getUnidadBasicaVehiculoRef() == null) {
			if (unidadEjercitoDO.getUnidadBasicaVehiculoId() == 0) {
				strbuf.append("NULL");
			} else {
				strbuf.append(unidadEjercitoDO.getUnidadBasicaVehiculoRef());
			}
		} else {
			if (unidadEjercitoDO.getUnidadBasicaVehiculoRef().getId() == 0) {
				throw new IllegalArgumentException( //
						"unidadEjercitoDO.getUnidadBasicaVehiculoRef().getId() == 0");
			} else {
				unidadEjercitoDO.setUnidadBasicaVehiculoId( //
						unidadEjercitoDO.getUnidadBasicaVehiculoRef().getId());
				strbuf.append(unidadEjercitoDO.getUnidadBasicaVehiculoId());
			}
		}

		strbuf.append(" WHERE ");
		strbuf.append(UnidadEjercitoDO.ID);
		strbuf.append(" = ");
		strbuf.append(unidadEjercitoDO.getId());

		System.err.println(strbuf.toString());

		connection.createStatement().execute(strbuf.toString());

	}
}
